#include <stdio.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <string.h>

void sm3_hash(const char* data) {
    EVP_MD_CTX* mdctx;
    const EVP_MD* md;
    unsigned char md_value[EVP_MAX_MD_SIZE];
    unsigned int md_len;

    // 使用SM3哈希算法
    OpenSSL_add_all_digests();
    md = EVP_get_digestbyname("sm3");
    if (md == NULL) {
        printf("Unknown message digest sm3\n");
        return;
    }

    // 创建并初始化散列上下文
    mdctx = EVP_MD_CTX_new();
    EVP_DigestInit_ex(mdctx, md, NULL);

    // 传递数据给散列函数
    EVP_DigestUpdate(mdctx, data, strlen(data));

    // 获取散列值
    EVP_DigestFinal_ex(mdctx, md_value, &md_len);

    // 打印散列值
    printf("SM3 hash: ");
    for (int i = 0; i < md_len; i++) {
        printf("%02x", md_value[i]);
    }
    printf("\n");

    // 清理
    EVP_MD_CTX_free(mdctx);
    EVP_cleanup();
}

int main(int argc, char* argv[]) {
    if (argc < 2) {
        printf("Usage: %s <string_to_hash>\n", argv[0]);
        return 1;
    }

    // 将命令行参数传递给sm3_hash函数
    sm3_hash(argv[1]);
    return 0;
}
